// pages/cart/index.js
//获取微信收货地址
//绑定点击事件
//调用微信自带api wx.chooseAddress(这种方式逻辑不完整)
//1,判断用户是否给与了获取地址的授权 这里有一个判断的关键词 scope 获取scope方法=>wx-getSetting 判断scope.address得值是true/false/undefined
//2,如果scope.address值为true 或者为undefined 证明用户给与授权 可以获取到收货地址
//3,如果scope.address值为false 获取用户授权失败 引导他打开授权 使用wx-openSetting方法

//当第一次点击商品添加购物车时也手动添加了属性存在缓存中 在onshow里
//购物车全选实现
//

//计算全选按钮方法
/**
 * 1,获取缓存中每个商品单选框的状态 也就是checked 如果都为true就选中全选框 如果有一个为false 就不全选
 * 这里使用一个 every()的方法 这个方法有个回调函数 如果有一个为false就直接返回false  如果都为true则会返回true
 * 只不过这个函数在空数组调用时会返回true所以要做一下判断 判断一下当前数组的长度 如果有则执行erery()方法没有直接返回false
 */

/**
 * 计算总数量总价格
 * 1.定义 totalPrice totalNum 变量
 * 2.获取总数组
 * 3.循环数组
 * 总数量： +=num 总价格 += num*price
 * 注意全选循环时使用的every有点多余可以一定放在这里实现 并注意如果购物车数组为空 则不会执行此方法 所以还要再次判断数组的长度赋值给checked
 */

/**
 * 选中取消选中价格数量计算功能
 * 0，获取到点击的商品
 * 1，触发改变事件 change
 * 2，拿到数组中的checked 状态  进行取反
 * 3，重新存回数组
 * 4，重新计算价格数量
 */

/**
 * 购物车全选状态改变
 * 1，绑定点击事件
 * 2，获取购物车全选按钮状态
 * 3，循环购物车数组改变每一个数组的选中状态
 * 4，将修改完的数组存在data中或者 缓存中
 */

/**
 * 购物车商品数量加减
 * 1，绑定点击事件
 * 添加自定义属性 商品ID 加减按钮区分属性
 * 获取数组
 * 找到被点击商品的索引
 *修改数量 调用方法存入缓存货data中
 */

/**
 * 删除商品功能
 * 1，当被点击的商品数量小于===1并且依旧点击-号时 弹出提示框是否要删除商品
 * 如果用户点击确定 删除商品 并把新的数组赋值data货缓存中
 * 否则什么也不做
 */

 /**
  * 去结算功能
  * 1，判断是否有收货地址以及购物车里是否有商品
  * 2，没有弹出提示
  * 3，都有跳转相应支付页面
  */
import { getSetting, openSetting, chooseAddress, showModel, showToast} from "../../utils/WxApi";
import regeneratorRuntime from "../../lib/runtime/runtime";

Page({
  data: {
    address: {},
    cartItem: [],
    totalPrice: 0,
    totalNum: 0,
    allChecked: false
  },
  onShow: function() {
    //获取收货地址 添加到缓存中
    const loaclAddress = wx.getStorageSync("address");
    //获取缓存中的商品添加到购物车页面中
    const cartItem = wx.getStorageSync("cart") || [];
    this.setData({
      address: loaclAddress
    });
    this.setCart(cartItem);
  },

  //获取收获地址
  //1.绑定点击事件
  async hanldeChooseAddress() {
    // 2.调用微信API
    // 用户点击确定
    try {
      //获取用户状态方法
      const res = await getSetting();
      //获取用户状态scope
      let scopeAddress = res.authSetting["scope.address"];
      //判断用户没有授权引导他打开授权
      if (scopeAddress == false) {
        await openSetting();
      }
      //用户授权成功获取用户地址
      let address = await chooseAddress();
      address.all =
        address.provinceName +
        address.cityName +
        address.countyName +
        address.detailInfo;
      console.log(address);
      wx.setStorageSync("address", address);
    } catch (error) {
      //用户点击取消
      console.log(error);
    }
  },

  //选中为选中功能实现价格数量改变等
  goodsChange(e) {
    //获取多点击的商品id
    const goodsId = e.currentTarget.dataset.goodid;
    //获取商品数组
    let { cartItem } = this.data;
    //通过id找到被点击的商品索引
    let index = cartItem.findIndex(v => v.goods_id === goodsId);
    cartItem[index].checked = !cartItem[index].checked;
    this.setCart(cartItem);
  },

  setCart(cartItem) {
    let allChecked = true;
    let totalNum = 0;
    //总数量
    let totalPrice = 0;
    //计算总价格总数量
    cartItem.forEach(v => {
      if (v.checked) {
        (totalNum += v.num), (totalPrice += v.num * v.goods_price);
      } else {
        allChecked = false;
      }
    });
    allChecked = cartItem.length != 0 ? allChecked : false;
    this.setData({
      cartItem,
      totalNum,
      totalPrice,
      allChecked
    });
    wx.setStorageSync("cart", cartItem);
  },
  handlecChangeALLChecked() {
    // 1 获取data中的数据
    let { cartItem, allChecked } = this.data;
    // 2 修改值
    allChecked = !allChecked;
    // 3 循环修改cartItem数组 中的商品选中状态
    cartItem.forEach(v => (v.checked = allChecked));
    // 4 把修改后的值 填充回data或者缓存中
    this.setCart(cartItem);
  },
  //购物车数量加减
 async  hanldeItemNumEdit(e) {
    //获取传递过来的参数
    let { id, operation } = e.currentTarget.dataset;
    //获取购物车数组
    let { cartItem } = this.data;
    //找到被点击的商品的索引值
    let index = cartItem.findIndex(v => v.goods_id === id);
    //判断购物车数组的数量
    if (cartItem[index].num === 1 && operation === -1) {
      const res = await showModel({content:"您确定要删出该商品吗？"});
      if (res.confirm) {
        cartItem.splice(index, 1);
        this.setCart(cartItem);
      }
  }else{
    //修改数量
    cartItem[index].num += operation;
    //存入data或缓存中
    this.setCart(cartItem);
  }
},

//去结算
async handlePay(){
  let{address,totalNum} = this.data
  if(!address.userName){
    await showToast({title:"你还没有选择收货地址哦"});
    return;
  }else if(totalNum==0){
    await showToast({title:"没有可以结算的商品"})
    return
  }else{
    wx.navigateTo({
      url: '/pages/pay/index',
    });
  }

}
});
